#ifndef VSqlMetaUtils_H
#define VSqlMetaUtils_H

#include "VSqlMetaMap.h"
#include "VSqlDataMRef.h"

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

class VSqlMetaUtilsTables
{
public:
	VSqlMetaUtilsTables(VSqlMetaMap &maps,const VSqlMeta &metaTables);
	
	VSqlMeta appendDataTable(VSqlItem &itemTable,VSqlItemList &itemFields);

private:
	bool createOrAlterDataTable(const VSqlMeta &table);
	bool createDataTable(const VSqlMeta &table);
	bool alterDataTable (const VSqlMeta &table,const QSqlRecord &fieldsInDb);

private:
	VSqlMetaMap &m_maps;
	VSqlMeta m_metaTables;
};

///////////////////////////////////////////////////////////////////////////////

class VSqlMetaUtilsTable
{
public:
	class VField
	{
	public:
		VField(const QString &keyName,const QVariant &value = QVariant()) { m_keyName = keyName; m_value = value;}
		
		QString keyName() const { return m_keyName;}
		QVariant value() const { return m_value;}
		
	private:
		QString m_keyName;
		QVariant m_value;
	};

public:
	VSqlMetaUtilsTable(VSqlMetaMap &metaMap);
	
	QVariant appendRecord(const VSqlMeta &metaTable,const QList<VField> fieldList);

private:
	VSqlMetaMap &m_metaMap;
};

///////////////////////////////////////////////////////////////////////////////

class VSqlMetaUtilsItemList
{
public:
	VSqlMetaUtilsItemList
	(
		VSqlMetaMap &metaMaps,
		const VSqlMeta &metaTable,
		const QString &keyNameItemList
	);

	VSqlMeta append(const VSqlMeta &metaParent,const QVariant &refIdRec);

private:
	VSqlMetaMap &m_metaMaps;
	VSqlItem m_itemItemList;
};

VSqlMeta VSqlMetaUtils_init(VSqlMetaMap &metaMaps);

///////////////////////////////////////////////////////////////////////////////

#endif
